#include<stdio.h>
int main()
{
	int a = 10; 
	printf("%p\n\n",&a);  //"&"表示取地址符号
	
	int* p = &a;
/*这行代码 int* p = &a; 的意思是声明一个指针变量 p,并将 a的地址赋值给它。
这里的 int*表示p是一个指向整数类型的指针变量。&a表示获取变量a的地址。
通过将&a赋值给p,p现在指向变量a的内存地址。
因此,通过p可以访问到a的值。如果想要读取或修改a的值，可以使用*p进行解引用操作。
例如,int value = *p;将会把a的值赋给 value 变量。
总结起来，int* p = &a; 这行代码的作用是声明一个指针 p，并将其指向变量 a 的内存地址，从而可以通过 p 来操作和访问变量 a 的值。
*/
	printf("%p\n",*p);
	printf("%p\n\n",p);
/*然后，printf("%p\n",*p); 这行代码使用 %p 格式化字符串打印指针 p 指向的位置所存储的值。
在这里，*p 解引用了指针 p，即获取了指针 p 所指向的变量的值。
由于 p 指向变量 a，所以这里输出的是变量 a 的值。
最后，printf("%p\n",p); 这行代码再次使用 %p 格式化字符串，直接打印指针 p 的值。
在这里，p 存储的是变量 a 的内存地址，所以输出的是变量 a 的地址。
因此，你看到的两个不同的输出分别是变量 a 的内存地址和变量 a 的值。记住 %p 格式化字符串可以用来打印指针的值或变量的地址。	
*/	
	printf("%d\n",*p);
	printf("%d\n\n",p);
/*第一行输出语句 printf("%d\n",*p);，使用 %d 格式化字符串打印指针 p 所指向的变量的值。
这里需要注意的是，*p 表示指针 p 所指向的变量的值，而不是指针 p 的值。
在这个示例中，p 指向变量 a，所以 *p 的值是 a 的值，即 10。因此，这行输出语句将会打印 10。
第二行输出语句 printf("%d\n",p);，同样使用 %d 格式化字符串打印指针 p 的值。由于指针变量本身存储的是一个地址值，
所以指针类型在内存中通常会占用多个字节，而不是只有一个字节。
当我们使用 %d 格式化字符串打印一个指针时，输出的结果实际上是指针变量在内存中存储的二进制值被解释为一个有符号整数后的输出结果。
因此，这行输出语句将会打印一个十进制数，它是指针 p 在内存中存储的二进制值被解释为有符号整数后的结果。
然而，由于指针 p 存储的是一个地址值，而不是一个普通的整数值，这个输出结果没有任何实际意义，因为指针的地址值本身并不代表任何有用的信息。
所以，正确的做法是使用 %p 格式化字符串来打印指针的值或变量的地址，而不是使用 %d。
*/

	printf("%d\n",sizeof(char*));
	printf("%d\n",sizeof(short*));
	printf("%d\n",sizeof(int*));
	printf("%d\n",sizeof(long*));
	printf("%d\n",sizeof(double*));
	printf("%d\n",sizeof(float*));
/*
在这个示例中，p 是一个 64 位操作系统上的指针，因此在内存中占用的字节数通常是 8。
	
*/

/*不管是什么类型的指针，都是在创建指针变量
指针变量是用来存放地址的
指针变量的大小取决于一个地址存放的时候需要多大的空间
32位机器上的地址：32bit - 4byte，所以指针变量的大小为 4	
64位机器上的地址：64bit - 8byte，所以指针变量的大小为 8
*/
	return 0;
}
